#include "command.hpp"

string TransToHex(key_t k)
{
    char buffer[32];
    snprintf(buffer,sizeof buffer, "0x%x" ,k);
    return buffer;
}

int main()
{
    //创建key值  //key类似于哈希的哪个映射位
    key_t k = ftok(PATH_NAME,PROJ_ID);    
    assert(k != -1);

    
    Log("create key done",Debug) << "server key : " << endl;

    //2. 创建共享内存 , 挂接到自己的地址空间 
    int shmid = shmget(k,SHM_SIZE,IPC_CREAT | IPC_EXCL | 0666); 
    //PC_CREAT | IPC_EXCL | mode：创建一个新的共享内存段，如果共享内存段已存在，则返回错误。 mode 为权限
    if(shmid == -1)
    {
        perror("shmget error");
        exit(1);
    }
    Log("create shm done",Debug) << "shmid:" << shmid << endl ;
    sleep(10);

    //3. 将指定的共享内存，挂接到自己的地址空间
    char* shmaddr = (char*)shmat(shmid,nullptr,0); 
    //shmat()函数返回一个指向共享内存段的指针，如果连接失败，则返回-1。
    //shmaddr为NULL，核心自动选择一个地址
    //SHM_RDONLY是一个宏定义，表示以只读方式打开共享内存段。它的值为0
    Log("attach shm done " , Debug) << "shmid:" << shmid << endl;
    sleep(10);

    //4. 将指定的共享内存，从自己的地址空间去关联
    int n = shmdt(shmaddr); 
    //shmaddr参数是指向共享内存段的指针，用于指定要分离的共享内存段。shmdt()函数返回0表示成功，返回-1表示失败。
    assert( n != 1) ; 
    (void) n ;
    Log("detach shm done", Debug) << "shmid:"<< shmid << endl;
    sleep(10);

    //5删除共享内容/删除共享内存
    //IPC_RMID即便是有进程和当下的shm挂接，依旧删除共享内存
    n = shmctl(shmid,IPC_RMID,nullptr);
    assert(n != -1);
    (void) n ;
    Log("delete shm done",Debug) << "shmid:"<< shmid << endl;
    return 0 ;
}
